package org.example.day02;

import java.util.*;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO +
 * <pre class="prettyprint lang-java">现有若干个会议，所有会议共享一个会议室，用数组表示每个会议的开始时间和结束时间，格式：[[会议1开始时间，会议1结束时间], [会议2开始时间，会议2结束时间]]。请计算会议室占用时间段。</pre> <br>
 * <p>
 * 现有若干个会议，所有会议共享一个会议室，用数组表示每个会议的开始时间和结束时间，
 * 格式：[[会议1开始时间，会议1结束时间], [会议2开始时间，会议2结束时间]]。请计算会议室占用时间段。
 * @date 2024/3/11 15:22
 */
public class test031 {
    static class Interval {
        int start;
        int end;

        Interval(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }

    public static List<Interval> mergeIntervals(List<Interval> intervals) {
        Collections.sort(intervals, Comparator.comparingInt(a -> a.start)); // 对时间段进行排序，以开始时间为关键字进行排序

        List<Interval> merged = new ArrayList<>(); // 初始化合并后的时间段列表

        for (Interval current : intervals) {
            // 如果合并后的时间段列表为空，或者当前时间段的开始时间大于已合并时间段的结束时间
            // 则将当前时间段添加到合并后的列表中
            if (merged.isEmpty() || current.start > merged.get(merged.size() - 1).end) {
                merged.add(current);
            } else {
                // 否则，当前时间段与已合并的最后一个时间段有重叠，更新已合并时间段的结束时间
                merged.get(merged.size() - 1).end = Math.max(merged.get(merged.size() - 1).end, current.end);
            }
        }

        return merged;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 读取输入的会议数量

        List<Interval> intervals = new ArrayList<>(); // 初始化会议时间段列表

        // 读取每个会议的开始和结束时间，添加到会议时间段列表中
        for (int i = 0; i < n; i++) {
            int start = scanner.nextInt();
            int end = scanner.nextInt();
            intervals.add(new Interval(start, end));
        }

        // 调用函数合并时间段
        List<Interval> mergedIntervals = mergeIntervals(intervals);

        // 打印合并后的会议室占用时间段
        for (Interval interval : mergedIntervals) {
            System.out.println(interval.start + " " + interval.end);
        }
    }
}
